﻿#include "InputDevice.h"
#include "PdfFontMetricsFreetype.h"
#include "PdfFontMetrics.h"
#include "FontTrueTypeSubset.h"
#include "freetype_wrap.hpp"
#include <vector>
#include <fstream>
#include <cstdint>
#include <string>

using namespace PoDoFo;
using namespace std;

// 修正 GetCharGIDInfos 函数以匹配 FontTrueTypeSubset 的期望
std::vector<PdfCharGIDInfo> GetCharGIDInfos(const std::map<unsigned, unsigned>& cidToGidMap,
	const std::vector<unsigned>& specificChars = {})
{
	std::vector<PdfCharGIDInfo> ret;

	// 必须包含 glyph 0 (.notdef)
	ret.push_back(PdfCharGIDInfo{
		0, 0 // GID 0 是必需的
		});

	if (specificChars.empty()) {
		ret.reserve(cidToGidMap.size() + 1);
		for (const auto& pair : cidToGidMap) {
			ret.push_back(PdfCharGIDInfo{
				pair.second, pair.first// Gid.Id = 字形索引, Gid.MetricsId = 原始CID
				});
		}
	}
	else {
		ret.reserve(specificChars.size() + 1);
		for (unsigned charCode : specificChars) {
			auto it = cidToGidMap.find(charCode);
			if (it != cidToGidMap.end()) {
				ret.push_back(PdfCharGIDInfo{
					it->second, it->first
					});
			}
		}
	}

	return ret;
}

bool WriteVectorToBinaryFile(const std::vector<uint8_t>& data,
	const std::string& filename,
	bool append = false)
{
	std::ofstream file(filename,
		std::ios::binary |
		(append ? std::ios::app : std::ios::trunc));

	if (!file.is_open()) {
		return false;
	}

	file.write(reinterpret_cast<const char*>(data.data()),
		static_cast<std::streamsize>(data.size()));

	if (!file.good()) {
		file.close();
		return false;
	}

	file.close();
	return true;
}

int main()
{
	// 创建字体度量对象
	auto pdf_font_metrics = PoDoFo::PdfFontMetricsFreetype::Create("C:\\Code\\Deng.ttf");

	FontGlyphMapper mapper;

	// 加载字体文件
	if (!mapper.loadFont("C:\\Code\\Deng.ttf")) {
		return 1;
	}

	// 解析字符到字形映射
	if (!mapper.parseCharToGlyphMap()) {
		return 1;
	}

	// 获取整个映射
	const auto& fullMap = mapper.getCharToGlyphMap();

	// 指定需要包含的字符
	vector<unsigned> specificChars = {
		'A', 'B', 'C', // 字母
		'1', '2', '3', // 数字
		0x4E00,        // 示例中文字符（"一"的Unicode码点）
		0x4E8C         // 示例中文字符（"二"的Unicode码点）
	};

	// 获取指定字符的映射信息
	auto infos = GetCharGIDInfos(fullMap, specificChars);

	charbuff buffer;

	// 修正调用方式 - 传递左值引用
	FontTrueTypeSubset::BuildFont(*pdf_font_metrics, infos, buffer);

	vector<uint8_t> subset_font_file(buffer.begin(), buffer.end());
	WriteVectorToBinaryFile(subset_font_file, "C:/subset_font.ttf");

	FontGlyphMapper mapper2;

	// 加载字体文件
	if (!mapper2.loadFont("C:/subset_font.ttf")) {
		return 1;
	}

	// 解析字符到字形映射
	if (!mapper2.parseCharToGlyphMap()) {
		return 1;
	}


	auto cid_gid_map =  mapper2.getCharToGlyphMap();
	mapper2.printMappingInfo();
}